import _ from "lodash";

/**
 * 清空data、params参数中的无效值
 * @param {*} config
 */
export const clearEmptyParam = (config) => {
  ["data", "params"].forEach((item) => {
    let newData = config[item];
    if (!newData) return;

    // 解析 JSON 字符串
    if (toRawType(newData) === "String") {
      try {
        newData = JSON.parse(newData);
      } catch (error) {
        console.log("clearEmptyParam转换失败", error);
        throw error;
      }
    }

    const keys = Object.keys(newData);
    if (!keys.length) return;

    keys.forEach((key) => {
      const value = newData[key];
      const rawType = toRawType(value);

      if (rawType === "Object") {
        // 深拷贝对象并清理无效值
        newData[key] = _.pickBy(_.cloneDeep(value), (e) => !isEmpty(e));
        return;
      }

      // 删除无效值
      if (isEmpty(value)) {
        delete newData[key];
      }
    });
  });
};

/**
 * @description 获取原始类型
 * @param {*} value
 * @returns {String} 类型字符串，如'String', 'Object', 'Null', 'Boolean', 'Number', 'Array' , 'Undefined'
 */
export const toRawType = (value) => {
  return Object.prototype.toString.call(value).slice(8, -1);
};

/**
 * 判断是不是空的，null、undefined、NaN、""
 * @param {*} value
 * @returns
 */
export const isEmpty = (value) => {
  return _.isNil(value) && _.isNaN(value) && value === "";
};

/**
 * 将外部传入的样式格式化为可读的 CSS 样式。
 * @param {object | object[]} styles 外部传入的样式对象或数组
 * @returns {string} 格式化后的 CSS 样式字符串
 */
export function objToStyle(styles) {
  // 如果 styles 是数组类型
  if (Array.isArray(styles)) {
    // 使用过滤函数去除空值和 null 值的元素
    // 对每个非空元素递归调用 objToStyle，然后通过分号连接
    return styles
      .filter(function (item) {
        return item != null && item !== "";
      })
      .map(function (item) {
        return objToStyle(item);
      })
      .join(";");
  }

  if (typeof styles === "string") {
    return styles;
  }

  // 如果 styles 是对象类型
  if (typeof styles === "object" && styles !== null) {
    // 使用 Object.keys 获取所有属性名
    // 使用过滤函数去除值为 null 或空字符串的属性
    // 对每个属性名和属性值进行格式化，通过分号连接
    return Object.keys(styles)
      .filter(function (key) {
        return styles[key] != null && styles[key] !== "";
      })
      .map(function (key) {
        // 将属性名和属性值格式化为 CSS 样式的键值对
        return [key, styles[key]].join(":");
      })
      .join(";");
  }
  // 如果 styles 不是对象也不是数组，则直接返回
  return "";
}

/**
 * @description 对num自动填充px
 * @param {Number} num
 * @return {string} num+px
 */
export function addUnit(num) {
  return Number.isNaN(Number(num)) ? `${num}` : `${num}px`;
}

/**
 * 延迟执行
 * @param {*} time
 * @returns
 */
export const delay = (time) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, time || 1000);
  });
};

export const pxToRpx = (px) => {
  let deviceWidth = wx.getSystemInfoSync().windowWidth; //获取设备屏幕宽度

  let rpx = (750 / deviceWidth) * Number(px);

  return Math.floor(rpx);
};
